/**
 * @author Jackson
 * @create 2025/3/12 14:34
 * @description 抽奖前置过滤责任链：工厂方法模式(责任链装配+责任链生成) + 责任链模式(黑名单 -> 权重策略抽奖 -> 默认抽奖)
 */
package com.zhihao.domain.strategy.service.rule.chain;

import com.zhihao.domain.strategy.repository.IStrategyRepository;

import java.util.Map;/*
    Q1. 构建所有的xxxLogicChain对象，并注入到Map中，应该怎么做？
        1) Map注入是默认使用class类名进行注入，不易于使用
        2） 为了方便和数据库表字段中的rule_blacklist、rule_weight关联
            1. 通过自定义注解写对应的枚举值
            2. 自定义类名字-@Component(value = "default_name") 修改Bean名字的方法

    Q2:’依赖注入‘的4种方式?
        method1: 构造函数注入	强制依赖、不可变、易测试(优点)	参数较多时构造函数冗长(缺点)	推荐作为默认选择(适用场景)
        'final'关键字修饰的变量 + 构造函数注入(spring4.3+只有一个构造函数时无需在构造函数上加@AutoWired注解)
                eg:
                    private final Map<String, ILogicChain> logicChainGroup;
                    protected IStrategyRepository repository;
                    public DefaultChainFactory(Map<String, ILogicChain> logicChainGroup, IStrategyRepository repository) {
                        this.logicChainGroup = logicChainGroup;
                        this.repository = repository;
                    }

       method2: 字段注入：	代码简洁	破坏封装性、难测试	快速原型开发（慎用）
               eg:
                    @Service
                    public class ProductService {
                        @Autowired
                        private InventoryService inventoryService;
                    }

       method3: Setter注入：	可选依赖、灵活性高	依赖关系隐蔽	可选依赖或需动态更新
                eg:
                    @Service
                    public class OrderService {
                        private PaymentService paymentService;

                        // Setter 注入
                        @Autowired
                        public void setPaymentService(PaymentService paymentService) {
                            this.paymentService = paymentService;
                        }
                    }
       method4: 接口注入	无	侵入性强、已过时	不推荐
 */